package com.adong.dao;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

/**
 * 插件的签名 :
 * 告诉myBatis当前插件用来拦截那个对象的那个方法
 */
@Intercepts(
        {
                @Signature(type = StatementHandler.class, method = "parameterize", args = Statement.class)
        })
public class MySecondPlugin implements Interceptor {
    /**
     * 拦截目标方法执行 :
     *
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //执行目标方法
        Object proceed = invocation.proceed();
        System.out.println("MySecondPlugin.intercept" + invocation.getMethod());
        //返回执行后的返回值
        return proceed;
    }

    /**
     * 包装目标对象的,为目标对象创建一个代理对象
     *
     * @param
     * @return
     */
    @Override
    public Object plugin(Object target) {
        //借助Plugin的wrap方法来使用当前Interceptor包装目标对象
        Object wrap = Plugin.wrap(target, this);
        System.out.println("MySecondPlugin.plugin" + target);
        //返回当前target创建的动态代理
        return wrap;
    }

    /**
     * 将插件注册时property属性设置进来
     *
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件的配置信息" + properties);

    }
}
